// enum State//用来标志该位置的状况：empty空，exist有数据，delete删除
// 	{
// 		EMPTY,
// 		EXIST,
// 		DELETE,
// 	};
// 	template <class k, class v>
// 	struct HashData
// 	{
// 		pair<k, v> _kv;//自定义类型，会初始化
// 		State _state = EMPTY;//初始化
// 	};

// 	template <class k, class v, class Hash = HashFunc<k>>
// 	class
// class HashTable
// {
//     typedef HashData<k, v> Data;
bool Insert(const pair<k, v> &kv)
{
    if (Find(kv.first))
        return false;
    // 负载因子过大，该扩容了
    if (_n / _table.size() >= 0.7)
    {
        HashTable<k, v, Hash> newh;
        newh._table.resize(_tables.size() * 2);
        ///// newh._table.resize(_n * 2);
        for (auto &e : _table)
        {
            // newh._table.insert(e);
            newh.Insert(e.kv);
        }
        _table.swap(newh._table);
    }
    Hash hf;
    size_t hsi = hf(kv.first) % _table.size();
    // while (_table[hsi] == EXIST)
    while (_table[hsi]._state == EXIST)
    {
        hsi++;
        hsi %= _table.size();
    }
    ///// _table[hsi] = kv.second;
    _table[hsi].kv = kv;
    _table[hsi]._state = EMPTY;
    ++_n;
    return true;
}


Data* Find(const k& key)
{
    Hash hf;
    size_t hsi = hf(key) %= _table.size();
    size_t old_hsi = hsi;
    while(_table[hsi]._state != EMPTY)
    {
        if(_table[hsi]._state==EXIST && _table[hsi]._kv.first == key)
            return &_table[hsi];
        ++hsi;
        hsi%= _table.size();
        if(hsi == old_hsi)
            break;
    }
    return nullptr;
}

bool Erase(const k& key)
{
    Date* ret = Find(key);
    if(ret)
    {
        ret->_state == DELETE;
        --_n;
        return true;
    }
    else
    {
        return false;
    }
}